{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": false
   },
   "source": [
    "- 第四章 训练模型\n",
    "- 了解模型时具体如何工作的\n",
    "- 有助于快速定位到合适的模型、正确的训练算法以及一套适当的超参数\n",
    "- 后期还能更高效地执行错误调试和错误分析。\n",
    "- 本章从最简单的线性回归模型开始介绍两种非常不同的训练模型的方法\n",
    ">1. 通过“闭式”方程——直接计算出最适合训练集的模型参数（也就是使训练集上的成本函数最小化的模型参数）\n",
    ">2. 使用迭代优化的方法，即梯度下降（GD），逐渐调整模型参数直至训练集上的成本函数调至最低，最终趋同于第一种方法计算出来的模型参数。我们还会研究几个梯度下降的变体，包括批量梯度下降、小批量梯度下降以及随机梯度下降。等我们进入到第二部分神经网络的学习时，会频繁地使用这几个变体。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "# 线性回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": false
   },
   "source": [
    "## 公式推导"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性回归模型预测\n",
    "$$ \\hat{y}=\\theta_0+\\theta_1X_1+\\theta_2X_2+……+\\theta_nX_n $$\n",
    "- $\\hat{y}$是预测值\n",
    "- $n$是特征数量\n",
    "- $X_i$是第i个特诊值\n",
    "- $\\theta_j$是第j个模型参数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性回归模型预测（向量化）\n",
    "$$ \\hat{y}=h_{\\theta}(X)=\\theta^T·X $$\n",
    "- $\\theta$是模型的参数向量\n",
    "- $X$是实例的特征向量，$X_0$永远为1\n",
    "- $h_\\theta$是模型参数$\\theta$的假设函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": false
   },
   "source": [
    "### 线性回归模型的MSE成本函数\n",
    "$$ MSE(X, h_\\theta)=\\frac{1}{m}\\sum^m_{i=1}(\\theta^T·X^{(i)}-y^{i})^2 $$\n",
    ">这里要求是让整个成本函数最小的$\\theta$值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 标准方程\n",
    "$$ \\hat{\\theta}=(X^T·X)^{-1}·X^T·y $$\n",
    "- $\\hat{\\theta}$是使成本函数最小的$\\theta$值\n",
    "- $y$是目标值向量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    ">公式测试"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = 2 * np.random.rand(100, 1)\n",
    "y = 4 + 3 * X + np.random.randn(100, 1)   # 后面加入噪声"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD5CAYAAAAp8/5SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAX+UlEQVR4nO3df5BdZX3H8c93d4kSiyUQrAxhA5k6dISpY7IDER1F8QciNq0wI4gOIDRja62t/SEOM9rxH+30l+3I6KRIlSkTFUirdWoLlTBOK4uzu0VAKRKiC2uoxLioCE2y2W//uOeGy/X+PD+f55z3ayaT+/t+89yT73nO93nOc8zdBQCor4mqAwAAFItEDwA1R6IHgJoj0QNAzZHoAaDmSPQAUHNTw15gZjdKukjSE+5+VvLYX0h6q6RDkh6RdJW7Pznss9avX++nnXZapoABoGnm5+d/5O4npX2/DZtHb2avlvSUpJs6Ev0bJd3p7itm9ueS5O4fHPZlMzMzPjc3lzZWAGgkM5t395m07x9aunH3r0v6cddjt7v7SnJ3VtKGtAEAAIqVR43+3ZK+msPnAAAKkCnRm9l1klYk3TzgNdvNbM7M5vbv35/l6wAAKaRO9GZ2hVqDtJf7gEK/u+9w9xl3nznppNRjCQCAlIbOuunFzC6Q9EFJr3H3p/MNCQCQp6E9ejPbKeluSWeY2ZKZXS3pk5KOk3SHmd1rZp8uOE4AQEpDe/TuflmPhz9TQCwAkJv5xWXN7j2grZtO1JaN66oOp1KpSjcAELL5xWVdfsOsDq2sas3UhG6+Zmujkz1LIACondm9B3RoZVWrLh1eWdXs3gNVh1QpEj2A2tm66UStmZrQpEnHTE1o66YTqw6pUpRuANTOlo3rdPM1W6nRJ0j0AGppy8Z1jU/wbZRuAKDmSPQAUHMkegCoORI9ANQciR4Aao5EDwA1R6IHgJoj0QNAzZHoAaDmSPQAUHMkegCoORI9ANQciR4ACja/uKzrd+/R/OJyJd/P6pUAUKAQrnZFjx4AChTC1a5I9ACg4sorIVztitINgMYrsrwSwtWuSPQAGq9XeSXPhFz11a4o3QBovBDKK0WiRw+g8UIorxSJRA8Aqr68UiRKNwBQcyR6AKg5Ej0AjKnqJQ3GRY0eAMbQOed+wkwf3XaW3nHOdNVhDUSPHgDG0DnnfmXV9eEvPRB8z55EDwBj2LrpRE2YHb2/uuqVrF8zjqGJ3sxuNLMnzOyBjsdOMLM7zOzh5O96zkkCgC5bNq7TR7edpakJ04SkNceEf4LVKDX6z0r6pKSbOh67VtLX3P3jZnZtcv+D+YcHAMPNLy6XerLTO86Z1hkvPi6aE6yGJnp3/7qZndb18DZJ5yW3PyfpLpHoAVSgqvXeYzrBKm2N/lfc/XFJSv5+UX4hAWi6caYvhrDee+gKn15pZtslbZek6emwpyABqNb84rJ2LSzplrnHtLLqI/XQ2wuSHV5ZreWCZHlIm+h/aGYnu/vjZnaypCf6vdDdd0jaIUkzMzOe8vsA1Fy7BHPw8KraiWLQksHzi8u6bWFJJunDF52p5acPRVEvr0LaRP9lSVdI+njy95dyiwhAI7VLMO0kb+q/ZPD84rIu23G3Dh1pvXrN1IR2/nb512KNxSjTK3dKulvSGWa2ZGZXq5Xg32BmD0t6Q3IfAFLrXBN+zdSELjtnum/ZZnbvAR0+8myBoLs2H9sSBUUbZdbNZX2eOj/nWAA02Dhrwm/ddKKOmbSjPfrOnn9Vs3BCxlo3AIIx6pTFLRvXaef2Vxyt0b9t84aj7yv6soAxItEDiFK/nUKRs3DKPjErLyR6AAPFltyKuixgzCUhEj2AvmJNbkWctRpzSYjVKwH0xVmnz+qcFRTbiVn06AH0xVmnzyqqJFQGcy/vZNWZmRmfm5sr7fsAZBdbjb6OzGze3WfSvp8ePYCBYlqlMY0m7MhI9AAaK9bB5nExGAugsZoy2EyiB9BYMc+kGQelGwCNFfNMmnGQ6IHANWGwsEp1H2yWSPRA0JoyWIhiUaMHAtaUwUIUi0QPBKLXxTKaMlhYtbpfqITSDRCAzhLN1OSELtmyQRcna6yHMlhY17GCJpTHSPRAADpLNIdWVrXznke1a2HpaNKpOvHUORmOuypljDs8SjdAANolGkvuu8Kqydd5rGCc8lh7h/dXtz+ky2+YjabUQ6IHAtAu0bzjnGmtmbTgavJljxWUWTNvt/0H3njG0COVWHd4lG6AQLRLNG/bvKGS0sCgkkSZYwVVlIlGLY/FumwziR4ITBU1+VGSa1lx9auZh1AbD2lwfBwkegBBXSavV685pMHgEAbHx0WiBxBUSaJXr/n63XuC2RHFiEQPILiSRHevOaQdUYy4lCCAYHXW5SUFsyMqG5cSBGouhEHIKvSqy7/3tb9adVgjC+l3I9EDAQtpELJsIQ0Qjyu0340TpoAc5X2iT6wn6OQh5gXdQvvd6NEDOSmiF9fkQciqBojzKLmE9ruR6IGcFFFqCG02TN6GJdWy56zntbMO7Xcj0aORihgoK6oXF+MJOqMIrY4t5buzDul3y5TozewPJV2j1mJ790u6yt3/L4/AgKIUlWCK7sWFNIsjDyEOtoZWcslL6kRvZqdI+n1JL3X3Z8zsi5IulfTZnGJDzRSRqNJ8ZpEJpqheXIi936xCTKqhlVzykrV0MyXpWDM7LGmtpH3ZQ0IdFZGo0n5miAlmmGE7pxh7+6Em1ZBKLnlJnejd/Qdm9peSHpX0jKTb3f323CJDrRTRi961sKSDh1efc5GOUT4z1AQzyKCdU8y9/Tol1ZB3tllKN+skbZN0uqQnJd1iZu9093/set12SdslaXp6OkOoiFnevej5xWXdMveY2gt4TE6O95mxJZhBO6cQa915CDlxdgt9Z5uldPN6Sd9z9/2SZGa7JJ0r6TmJ3t13SNohtda6yfB9iFjevejZvQe0stranEzSJVs2BPUfqwj9dk4xlqKGCT1xdgt9Z5sl0T8qaauZrVWrdHO+JFYsQ1959qK7k9vFmzfk8rnjCqHXGWMpapjQE2e30He2WWr095jZrZIWJK1I+m8lPXegaCEkt5B6nUWXosreoYWeOLuFsD0OkmnWjbt/RNJHcooFGEvVdfbYep1pVXUN15ATZy9Vb4+DcGYskFJsvc60suzQBh0JhLb8QZ2R6FE7ZZUZYux1ppF2hzboSCCkslcTkOhRK2UnkCb0OtPu0AYdCTSl7BUKEj1qhQSSThFllEFHAnmVvUKY9RQDEj1KU8Z/yqbUzfNUxSJveZS9KP+MjkSPUpT1n7IpdfM8VbXIW9ayF0dvoyPRoxRl/qdsQt08T7EeBcUadxVI9CgF/ynDFetRUKxxV8Hcy1t+ZmZmxufmWCWhqRg4y66qNuS3q5aZzbv7TNr306NHadollfnFZV2/ew9JY0xVDT4y6Bk/Ej1KFUvSCKkH245l35PPVDL4yKBn/Ej0KFUMSSOknVFnLFMTpqnJCR05Uu44B+Mr8SPRFyyknmEIYkgaIe2MOmM5sup6+9mn6pTjjy11e2LQM34k+gKF1DMMRQxJI6SdUa9196toM6asxo1EX6CQeoa9VHW0EXrSGHVnVEb7xbBjRPhI9AUKqWfYrQlHG1kS8bCdUZntF/qOEeEj0Rco5N5Y6Ecboxi21nmRibgO7YfmINEXLNTeWMhHG6MYlsiLTsSxtx+ahUTfUCEfbYxiWCIvOhHH3n5oFhJ9g4V6tDGKYYm8jEQcc/uhWVjrBtHiHAU0BWvdIGpFzozJ4zvKEkOMiBeJHpUpY4piDNNIY4gRcZuoOgA0V68B1Ri/I6sYYkTcSPSoTHtAddJU2BTFMr4jqxhiRNwYjEWlyqhNd39HiPXwEGNCOLIOxpLoU+I/ZnhG+U2ohyNGzLqpAMkiPKP+JixdgCaiRp9CXQfP2pf4m19crjqUsY36m1RVD4+5bRE/evQp1HGdk9iPUkb9TapYuiD2tkX8SPQphLTOybAVHEeNMfaSxji/SdlLF8TetogfiT6lENY5GdRTHLcXWYejlBB+k17q0LaIW6ZEb2bHS7pB0lmSXNK73f3uPALDcIN6iuP2Its94l0LSypvHlYzhHQEiGbK2qP/W0n/5u6XmNkaSWtziAkjGtRTTNuLvG1hSYdWVrVrYYlaco5CPdpAM6RO9Gb2QkmvlnSlJLn7IUmH8gkLoxjUU0zTi9y1sKSDh1flopYM1EmWHv0mSfsl/YOZvUzSvKT3u/vPc4kMIxnUUxynFzm/uKxb5h47WraZnKSWDNRFlnn0U5I2S/qUu79c0s8lXdv9IjPbbmZzZja3f//+DF+HIs3uPaCV1VaaN0mXbNmQujfPnHEgLFl69EuSltz9nuT+reqR6N19h6QdUmsJhAzfV4iQljKoMpbumv7Fmzek+pzY54yHtD0AeUmd6N39f83sMTM7w90fknS+pO/kF1rxQklK84vL2rWwpFvmHtPKqlcSS14zQ2KeMx7K9gDkLeusm/dJujmZcbNX0lXZQypPCEmpnVzag6BSdbH0q+n36uX26/nGPGc8hO0BKEKmRO/u90pKvaJa1UJISu3k0k7yprDWJO/Vy5XUt+cb85zxELYHoAiNPjM2hKTUmVwmJyd0yZYNunhz+oHQvPVbLGxQzzfWOeMhbA9AERqd6KXqk1LoyaVfL7euPd+qtwegCFx4BEONU6MHkD8uPILc9EvevXq59HyBeJDoIYmphUCdkehrIm0ppf2+fU8+w9RCoKZI9DWQtjfe+b6pCdPU5ISOHKnfACvQdCT6Gkh7ok/n+46sut5+9qk65fhjUw2wMjgLhItEXwNpT/Tptb5NmiRNfR8IG4m+BtLOxWd9G6AZGpno61hmSDvdcdz39Wo7lg4Awta4RE+ZIb1+bRf62b1A0zUu0fdbu4UkNdygEk3VJ1DV8SgNyEvjEn13mWHd2jX08EcUaomGozRgsMYl+u4yQ50GEovu1YZaoqnTbwgUIdpEnyWpdZcZQuyljqusXm3VJZpeQj3SAEIRZaLPM6mF2ksdV5N7tXX5DYGiRJno805qIfZSx9X0Xm0dfkOgKFEm+qYntV7y7tUyiwWoj2gvPEIiKg6zWICwNPbCI3kdqrPD+EVNrvcDdRRtos9DkT3XmHcglMaAeml0oi+q5xp76YNZLEC9NDrRF9VzzXMHUtWRQR6lsZiPaoA6aXSiL6rnmtcOJOYjg5hjB+qmEYl+UM+yiPnXrPMed+xA3dQ+0VfVs8xjBxLzoGjMsQN1U/tEH3PPMuZB0ZhjB+qm1ol+fnFZ+558RlMTpiOrnmvPsqyBxphP7Y85dqBOapvoO0s2U5MTevvZp6a++PWgz2agEUDoJqoOoCidJZsjR1Z1yvHH5paM+12lCgBCVItEP7+4rOt379H84vLRx9qDgZOm3AcDi/xsAMhb5tKNmU1KmpP0A3e/KHtI4xl2wepdC0vKe9k2BhoBxCSPGv37JT0o6YU5fNbYhs2quW1hSYdWVrVrYSnXWjoDjQBikal0Y2YbJL1F0g35hDO+QWUUaukAkL1H/wlJfyrpuBxiSWVQGYWTdgAgQ6I3s4skPeHu82Z23oDXbZe0XZKmp6fTft1A/coo1NIBIMMVpszsY5LeJWlF0vPVqtHvcvd39ntPnleYqgorMgIoW2VXmHL3D0n6UBLEeZL+eFCSrwNOlAIQo1rMoy/L7N4DOni4Nbh76DCDuwDikMsSCO5+l6S78viskK1bu+bonPzV5D4AhI4e/RiWnz6kCWvdnrDWfQAIXRSJvtcSB1XonLO/humaACIR/OqVIQ2AMl0TQIyCT/ShXTiEpQ8AxCb40g0rRQJANsH36CmXAEA2wSd6iXIJAGQRfOlmkFBm4wBAyKLo0fcS0mwcAAhZtD161poHgNFEm+iZjQMAo4m2dMNsHAAYTbSJXmI2DgCMItrSDQBgNCR6AKg5Ej0A1ByJHgBqjkQPADUXdaJnCQQAGC7a6ZUsgQAAo4m2R88SCAAwmmgTPUsgAMBooi3dsAQCAIwm2kQvsQQCAIwi2tINAGA0JHoAqDkSPQDUHIkeAGqORA8ANUeiB4CaI9EDQM2R6AGg5lInejM71cx2m9mDZvZtM3t/noEBAPKR5czYFUl/5O4LZnacpHkzu8Pdv5NTbFGYX1xmGQYAQUud6N39cUmPJ7d/ZmYPSjpFUmMSPUslA4hBLjV6MztN0ssl3ZPH58WCpZIBxCBzojezX5J0m6Q/cPef9nh+u5nNmdnc/v37s35dUFgqGUAMzN3Tv9nsGElfkfTv7v7Xw14/MzPjc3Nzqb8vRNToARTNzObdfSbt+1PX6M3MJH1G0oOjJPm6YqlkAKHLUrp5paR3SXqdmd2b/Lkwp7gAADnJMuvmPyVZjrEAAArAmbEAUHMkegCoORI9ANQciR4Aai7TPPqxv8xsv6TFEV++XtKPCgwnK+LLJvT4pPBjJL7sQo+xHd9Gdz8p7YeUmujHYWZzWU4QKBrxZRN6fFL4MRJfdqHHmFd8lG4AoOZI9ABQcyEn+h1VBzAE8WUTenxS+DESX3ahx5hLfMHW6AEA+Qi5Rw8AyEHpid7MLjCzh8xsj5ld2+P555nZF5Ln70kuatJ+7kPJ4w+Z2Zsqiu8DZvYdM7vPzL5mZhs7njvSscDbl4uIb8QYrzSz/R2xXNPx3BVm9nDy54qK4vubjti+a2ZPdjxXeBua2Y1m9oSZPdDneTOzv0viv8/MNnc8V0b7DYvv8iSu+8zsG2b2so7nvm9m9yftV8ia4CPEd56Z/aTjd/xwx3MDt40SY/yTjvgeSLa7E5LnymjDodfcznU7dPfS/kialPSIpE2S1kj6lqSXdr3mdyV9Orl9qaQvJLdfmrz+eZJOTz5nsoL4XitpbXL7d9rxJfefCqQNr5T0yR7vPUHS3uTvdcntdWXH1/X690m6seQ2fLWkzZIe6PP8hZK+qtaifVsl3VNW+40Y37nt75X05nZ8yf3vS1pfcfudJ+krWbeNImPseu1bJd1ZchueLGlzcvs4Sd/t8f84t+2w7B792ZL2uPtedz8k6fOStnW9ZpukzyW3b5V0vplZ8vjn3f2gu39P0p7k80qNz913u/vTyd1ZSRtyjiFzjAO8SdId7v5jd1+WdIekCyqO7zJJO3OOYSB3/7qkHw94yTZJN3nLrKTjzexkldN+Q+Nz928k3y9VsA2O0H79ZNl2xzJmjFVsg4+7+0Jy+2eS2tfc7pTbdlh2oj9F0mMd95f0i/+4o69x9xVJP5F04ojvLSO+Tlertcdte761Lps4a2a/mXNsbaPGeHFyuHermZ065nvLiE9J2et0SXd2PFxGGw7T799QRvuNq3sbdEm3m9m8mW2vKCZJeoWZfcvMvmpmZyaPBdd+ZrZWrSR5W8fDpbah9b/mdm7bYer16FPqtX5997Sffq8Z5b1ZjfwdZvZOSTOSXtPx8LS77zOzTZLuNLP73f2RCmL8F0k73f2gmb1HrSOk14343jLia7tU0q3ufqTjsTLacJgqt8GRmdlr1Ur0r+p4+JVJ+71I0h1m9j9J77ZMC2qdsv+UtS5G9M+SXqLA2i/xVkn/5e6dvf/S2tAGX3M7t+2w7B79kqRTO+5vkLSv32vMbErSL6t1CDbKe8uIT2b2eknXSfoNdz/Yftzd9yV/75V0l1p76bwNjdHdD3TE9feStoz63jLi63Cpug6ZS2rDYfr9G8pov5GY2a9LukHSNnc/0H68o/2ekPRPyr+8OZS7/9Tdn0pu/6ukY8xsvQJqvw6DtsFC29Ba19y+TdLN7r6rx0vy2w6LHHDoMQAxpdbAwel6djDmzK7XvFfPHYz9YnL7TD13MHav8h+MHSW+l6s1oPSSrsfXSXpecnu9pIdVwEDTiDGe3HH7tyTN+rODON9LYl2X3D6h7PiS152h1qCXld2Gyeefpv6DiW/RcwfBvllW+40Y37RaY1Tndj3+AknHddz+hqQLKojvxe3fVa0k+WjSliNtG2XEmDzf7kS+oOw2TNrjJkmfGPCa3LbDQhp4yD/wQrVGmB+RdF3y2EfV6h1L0vMl3ZJsyN+UtKnjvdcl73tI0psriu8/JP1Q0r3Jny8nj58r6f5k471f0tUVtuHHJH07iWW3pF/reO+7k7bdI+mqKuJL7v+ZpI93va+UNlSrB/e4pMNq9Y6ulvQeSe9JnjdJ1yfx3y9ppuT2GxbfDZKWO7bBueTxTUnbfSv5/a+rKL7f69j+ZtWxQ+q1bVQRY/KaK9Wa4NH5vrLa8FVqlVvu6/gdLyxqO+TMWACoOc6MBYCaI9EDQM2R6AGg5kj0AFBzJHoAqDkSPQDUHIkeAGqORA8ANff/NxIUmmRImacAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(X, y, '.')\n",
    "plt.axis = ([0, 2, 0, 14])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用标准方差测试公式\n",
    "X_b = np.c_[np.ones((100, 1)), X]     # 添加X0为1\n",
    "# linalg.inv()求逆， dot()求内积\n",
    "theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4.04964624],\n",
       "       [3.05690949]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta_best"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<small>因为有噪声，所以不可能与原来设置的参数完全一样</small>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用theta_best做出预测\n",
    "X_new = np.array([[0], [2]])\n",
    "X_new_b = np.c_[np.ones((2, 1)), X_new]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 4.04964624],\n",
       "       [10.16346523]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_predict = X_new_b.dot(theta_best)\n",
    "y_predict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x2788845ebe0>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 预测结果可视化\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.plot(X_new, y_predict, 'r-', label='预测结果')\n",
    "plt.plot(X, y, '.')\n",
    "plt.axis = ([0, 2, 0, 14])\n",
    "plt.legend(loc='upper left')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 计算复杂度\n",
    "- 标准方程求逆的矩阵XT·X，是一个n×n矩阵（n是特征数量）。对这种矩阵求逆的计算复杂度通常为O（n2.4）到O（n3）之间（取决于计算实现）。换句话说，如果将特征数量翻倍，那么计算时间将乘以大约22.4＝5.3倍到23＝8倍之间\n",
    "- 特征数量比较大（例如100000）时，标准方程的计算将极其缓慢\n",
    "- 训练耗时长，预测时比较快"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "# 梯度下降"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 理论推导"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "### 概述\n",
    "- 梯度下降是一种非常通用的优化算法，能够为大范围的问题找到最优解,梯度下降的中心思想就是迭代地调整参数从而使成本函数最小化\n",
    "- 假设你迷失在山上的浓雾之中，你能感觉到的只有你脚下路面的坡度。快速到达山脚的一个策略就是沿着最陡的方向下坡。\n",
    "- 这就是梯度下降的做法：通过测量参数向量θ相关的误差函数的局部梯度，并不断沿着降低梯度的方向调整，直到梯度降为0，到达最小值！\n",
    "- 具体来说，首先使用一个随机的θ值（这被称为随机初始化），然后逐步改进，每次踏出一步，每一步都尝试降低一点成本函数（如MSE），直到算法收敛出一个最小值\n",
    "\n",
    "![](img/4-3.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "### 步长的选取\n",
    "- 梯度下降中一个重要参数是每一步的步长，这取决于超参数学习率。 \n",
    "- 如果学习率太低， 算法需要经过大量迭代才能收敛， 这将耗费很长时间\n",
    "> ![](img/4-4.png)\n",
    "\n",
    "- 如果学习率太高，那你可能会越过山谷直接到达山的另一边，甚至有可能比之前的起点还要高。这会导致算法发散，值越来越大 最后无法找到好的解决方案\n",
    "> ![](img/4-5.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 梯度下降陷阱\n",
    "- 并不是所有的成本函数看起来都像一个漂亮的碗。有的可能看着像洞、像山脉、像高原或者是各种不规则的地形，导致很难收敛到最小值。\n",
    "- 图4-6显示了梯度下降的两个主要挑战：如果随机初始化，算法从左侧起步，那么会收敛到一个局部最小值，而不是全局最小值。如果算法从右侧起步，那么需要经过很长时间才能越过整片高原，如果你停下得太早，将永远达不到全局最小值\n",
    ">![](img/4-6.png)\n",
    "\n",
    "- 线性回归模型的MSE成本函数恰好是个凸函数，所以不存在局部最小值\n",
    "- 有时候特征值进行缩放会更容易达到全局最小值\n",
    ">![](img/4-7.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 批量梯度下降"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 要实现梯度下降，需要计算每个模型关于参数$θ_j$的成本函数的梯度。 \n",
    "- 你需要计算的是如果改变$θ_j$， 成本函数会改变多少。这被称为偏导数\n",
    ">$$ \\frac{\\partial}{\\partial\\theta_j}MSE(\\theta)=\\frac{2}{m}\\sum^m_{i=1}(\\theta^T·X^{(i)}-y^{i})x_j^{(i)} $$\n",
    "\n",
    "- 成本函数梯度向量\n",
    ">$$ \\nabla_{\\theta} MSE(\\theta)=\\frac{2}{m}X^T·(X·\\theta-y) $$\n",
    "\n",
    "- 计算梯度下降的每一步时，都是基于完整的训练集X的。这就是为什么该算法会被称为批量梯度下降：每一步都使用整批训练数据。因此，面对<font color='red'>非常庞大</font>的训练集时，算法会变得极慢（不过我们即将看到快得多的梯度下降算法）。但是，梯度下降算法随<font color='red'>特征数量扩展</font>的表现比较好：如果要训练的线性模型拥有几十万个特征，使用梯度下降比标准方程要快得多。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 梯度下降步长\n",
    "$$ \\theta^{(nextstep)}=\\theta-\\eta\\nabla_{\\theta}MSE(\\theta) $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[4.04964624]\n",
      " [3.05690949]]\n"
     ]
    }
   ],
   "source": [
    "eta = 0.1    # 学习率\n",
    "n_interations = 1000   # 迭代次数\n",
    "m = 100\n",
    "theta = np.random.randn(2, 1)\n",
    "for iteration in range(n_interations):\n",
    "    grandients = 2/m * X_b.T.dot(X_b.dot(theta) - y)\n",
    "    theta -= eta * grandients\n",
    "print(theta)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 结果和上面线性回归的差不多"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_gradient_descent(theta, eta, theta_path=None):\n",
    "    m = len(X_b)\n",
    "    plt.plot(X, y, \"b.\")\n",
    "    n_iterations = 1000\n",
    "    for iteration in range(n_iterations):\n",
    "        if iteration < 10:\n",
    "            y_predict = X_new_b.dot(theta)\n",
    "            style = \"b-\" if iteration > 0 else \"r--\"\n",
    "            plt.plot(X_new, y_predict, style)\n",
    "        gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)\n",
    "        theta = theta - eta * gradients\n",
    "    plt.xlabel(\"$x_1$\", fontsize=18)\n",
    "    plt.axis = ([0, 2, 0, 15])\n",
    "    plt.title(r\"$\\eta = {}$\".format(eta), fontsize=16)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(42)\n",
    "theta = np.random.randn(2,1)  # random initialization\n",
    "\n",
    "plt.figure(figsize=(10,4))\n",
    "plt.subplot(131); plot_gradient_descent(theta, eta=0.02)\n",
    "plt.ylabel(\"$y$\", rotation=0, fontsize=18)\n",
    "plt.subplot(132); plot_gradient_descent(theta, eta=0.1)\n",
    "plt.subplot(133); plot_gradient_descent(theta, eta=0.5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 左边学习率太低，右边学习率太高\n",
    "- 可以通过网格搜索找到合适的学习率，需要限制迭代次数\n",
    ">- 如果设置太低， 算法可能在离最优解还很远时就停了； \n",
    ">- 但是如果设置得太高， 模型达到最优解后， 继续迭代参数不再变化， 又会浪费时间。 \n",
    ">- 一个简单的办法是， 在开始时设置一个非常大的迭代次数， \n",
    ">- 但是当梯度向量的值变得很微小时中断算法——也就是当它的范数变得低于（称为容差） 时，\n",
    ">- 因为这时梯度下降已经（几乎） 到达了最小值。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 随机梯度下降"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析\n",
    "- 批量梯度下降的主要问题是它要用整个训练集来计算每一步的梯度， 所以训练集很大时， 算法会特别慢。 \n",
    "- 与之相反的极端是随机梯度下降， 每一步在训练集中随机选择一个实例， 并且仅基于该单个实例\n",
    "来计算梯度。\n",
    "- 显然， 这让算法变得快多了， 因为每个迭代都只需要操作少量的数据。 它也可以被用来训练海量的数据集， 因为每次迭代只需要在内存中运行一个实例即可\n",
    "- 由于算法的随机性质， 它比批量梯度下降要不规则得多。 成本函数将不再是缓缓降低直到抵达最小值， 而是不断上上下下， 但是从整体来看， 还是在慢慢下降。 随着时间推移， 最终会非常接近最小值， 但是即使它到达了最小值， 依旧还会持续反弹， 永远不会停止（见图4-9） 。 所以算法停下来的参数值肯定是<font color='red'>足够好</font>的， 但<mark>不是最优</mark>的。\n",
    "![](img/4-9.png)\n",
    "- 随机性的好处在于可以逃离局部最优， 但缺点是永远定位不出最小值。 \n",
    "- 要解决这个困境，有一个办法是逐步降低学习率。开始的步长比较大（这有助于快速进展和逃离局部最小值），然后越来越小，让算法尽量靠近全局最小值。 （过程叫作模拟退火）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_epochs = 50\n",
    "t0, t1 = 5, 50\n",
    "def learning_schedule(t):\n",
    "    return t0 / (t + t1)\n",
    "\n",
    "theta = np.random.randn(2, 1)\n",
    "\n",
    "for epoch in range(n_epochs):\n",
    "    for i in range(m):\n",
    "        random_index = np.random.randint(m)\n",
    "        xi = X_b[random_index : random_index + 1]\n",
    "        yi = y[random_index : random_index + 1]\n",
    "        grandients = 2 * xi.T.dot(xi.dot(theta) - yi)\n",
    "        eat = learning_schedule(epoch * m + i)\n",
    "        theta -= eta * grandients"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4.24542723],\n",
       "       [3.03701388]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "theta"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用sklearn API实现随机梯度下降"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SGDRegressor(alpha=0.0001, average=False, early_stopping=False, epsilon=0.1,\n",
       "             eta0=0.1, fit_intercept=True, l1_ratio=0.15,\n",
       "             learning_rate='invscaling', loss='squared_loss', max_iter=50,\n",
       "             n_iter_no_change=5, penalty=None, power_t=0.25, random_state=42,\n",
       "             shuffle=True, tol=-inf, validation_fraction=0.1, verbose=0,\n",
       "             warm_start=False)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import SGDRegressor\n",
    "sgd_reg = SGDRegressor(max_iter=50, penalty=None, eta0=0.1, random_state=42, tol=-np.infty)\n",
    "sgd_reg.fit(X, y.ravel())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "斜率： [4.06110635]\n",
      "截距 [3.06541784]\n"
     ]
    }
   ],
   "source": [
    "print('斜率：', sgd_reg.intercept_)    # 截距\n",
    "print('截距', sgd_reg.coef_)        # 斜率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 小批量梯度下降"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 每一步的梯度计算， 既不是基于整个训练集（如批量梯度下降） 也不是基于单个实例（如随机梯度下降） \n",
    "-  而是基于一小部分随机的实例集也就是小批量\n",
    "- 小批量梯度下降的主要优势在于可以从矩阵运算的硬件优化中获得显著的性能提升， 特别是需要用到图形处理器时\n",
    "- 这个算法在参数空间层面的前进过程也不像SGD那样不稳定， 特别是批量较大时。 所以小批量梯度下降最终会比SGD更接近最小值一些。 但是另一方面， 它可能更难从局部最小值中逃脱\n",
    "\n",
    "![](img/4-11.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 线性回归算法比较\n",
    "<small>m为训练集数量，n为预测集数量</small>\n",
    "\n",
    "![](img/4-1.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "# 多项式回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 概述\n",
    "- 如果数据比简单的直线更为复杂， 该怎么办？ \n",
    "- 令人意想不到的是， 其实你也可以用线性模型来拟合非线性数据。 \n",
    "- 一个简单的方法就是将每个特征的幂次方添加为一个新特征， 然后在这个拓展过的特征集上训练线性模型。 \n",
    "- 这种方法被称为多项式回归。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "m = 100\n",
    "X = 6 * np.random.rand(m, 1) - 3\n",
    "y = 0.5 * (X**2) + X + 2 + np.random.randn(m, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2788a9c7390>]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(X, y, '.')   # 原始数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 显然， 直线永远不可能拟合这个数据。 所以我们使用Scikit-Learn的PolynomialFeatures类来对训练数据进行转换， 将每个特征的平方（二次多项式） 作为新特征加入训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "poly_features = PolynomialFeatures(degree=2, include_bias=False)\n",
    "X_poly = poly_features.fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2788aa676a0>]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(X, X_poly[:,1], '.')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "lin_reg = LinearRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lin_reg.fit(X_poly, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "截距： [2.23493498]\n",
      "斜率： [[0.91667792 0.46089666]]\n"
     ]
    }
   ],
   "source": [
    "print('截距：', lin_reg.intercept_)\n",
    "print('斜率：', lin_reg.coef_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x2788aac7f28>"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_new=np.linspace(-3, 3, 100).reshape(100, 1)\n",
    "X_new_poly = poly_features.transform(X_new)\n",
    "y_new = lin_reg.predict(X_new_poly)\n",
    "plt.plot(X, y, '.')\n",
    "plt.plot(X_new, y_new, 'r-', label='预测结果')\n",
    "plt.legend(loc='upper left')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "# 学习曲线"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 概述\n",
    "- 高阶多项式回归对训练数据的拟合， 很可能会比简单线性回归要好。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "for style, width, degree in ((\"g-\", 1, 300), (\"b--\", 2, 2), (\"r-+\", 2, 1)):\n",
    "    polybig_features = PolynomialFeatures(degree=degree, include_bias=False)\n",
    "    std_scaler = StandardScaler()\n",
    "    lin_reg = LinearRegression()\n",
    "    polynomial_regression = Pipeline([\n",
    "            (\"poly_features\", polybig_features),\n",
    "            (\"std_scaler\", std_scaler),\n",
    "            (\"lin_reg\", lin_reg),\n",
    "        ])\n",
    "    polynomial_regression.fit(X, y)\n",
    "    y_newbig = polynomial_regression.predict(X_new)\n",
    "    plt.plot(X_new, y_newbig, style, label=str(degree), linewidth=width)\n",
    "\n",
    "plt.plot(X, y, \"b.\", linewidth=3)\n",
    "plt.legend(loc=\"upper left\")\n",
    "plt.xlabel(\"$x_1$\", fontsize=18)\n",
    "plt.ylabel(\"$y$\", rotation=0, fontsize=18)\n",
    "plt.xlim(-3,3)\n",
    "plt.ylim(0,10)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    ">- 当多项式阶数为300时，出现了过度拟合的现象\n",
    ">- 线性回归时，无法拟合\n",
    ">- 多项式为2时拟合效果最好"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 如何确定模型的复杂程度呢？ 怎么才能判断模型是过度拟合还是拟合不足呢？\n",
    "- 交叉验证来评估模型的泛化性能。 \n",
    ">- 如果模型在训练集上表现良好， 但是交叉验证的泛化表现非常糟糕， 那么模型就是过度拟合。 \n",
    ">- 如果在二者上的表现都不佳， 那就是拟合不足。\n",
    "- 学习曲线\n",
    ">- 这个曲线绘制的是模型在训练集和验证集上， 关于“训练集大小”的性能函数。 \n",
    ">- 要生成这个曲线， 只需要在不同大小的训练子集上多次训练模型即可。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 绘制学习曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "def plot_learning_curves(model, X, y):\n",
    "    X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2)\n",
    "    train_errors, val_errors = [], []\n",
    "    for m in range(1, len(X_train)):\n",
    "        model.fit(X_train[:m], y_train[:m])\n",
    "        y_train_predict = model.predict(X_train[:m])\n",
    "        y_val_predict = model.predict(X_val)\n",
    "        train_errors.append(mean_squared_error(y_train_predict, y_train[:m]))\n",
    "        val_errors.append(mean_squared_error(y_val_predict, y_val))\n",
    "    plt.plot(np.sqrt(train_errors), 'r-+', linewidth=2, label='训练集')\n",
    "    plt.plot(np.sqrt(val_errors), 'b-', linewidth=3, label='验证集')\n",
    "    plt.legend(loc='upper right')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "lin_reg = LinearRegression()\n",
    "plot_learning_curves(lin_reg, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 这条学习曲线是典型的模型拟合不足。 两条曲线均到达高地， 非常接近， 而且相当高。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 3)"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAD6CAYAAACrklzBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3dd5xU5b3H8c9vYWGBXToiCioghGpdKSoGAQsBBdFgi16jxtxEvbbExGthMcbLVYPtKhELURSJHVNsKCgolsWCWFBRVEAElt53Z5/7x7PDbJndmVmm7cz3/Xqd15wzc+bMM7Pwm9/8znOex5xziIhI5slJdQNERCQxFOBFRDKUAryISIZSgBcRyVAK8CIiGUoBXkQkQ0UV4M2srZkdZ2btE90gERGJj4gB3szaAP8EBgBzzKxDLfs9aGYLzOy6OLdRRETqIZoM/iDgSufcn4GXgMOq72Bm44BGzrnBQDcz6xHfZoqISKwaR9rBOfc6gJkdg8/ibwyz21DgiYr1l4GjgS8r72BmFwEXAbRo0eLw1q17sWKFf6xjR+jc2a8vXQobNvj1bt2gTZuY3k/aWrYMSkr8+v77Q3sVu0QkRgsXLlzrnAtbRQknYoAHMDMDTgfWA6VhdmkBVIRr1hEmy3fOTQWmAhQWFrqzzirmqqv8Y2eeCbff7tfHjYNnn/Xrt97qtzPBBRfAQw/59euugwsvTG17RKThMbNvY9k/qpOszrsYWAScHGaXLUCzivX8aI6bmxtaLyur/FrRtKjhadQotF5enrp2iEj2iOYk6x/M7NyKzdbAhjC7LcSXZQAOBpZFOm7jSr8dSsP9JgDMIh2l4cip9EkHAqlrh4hkj2gy+KnAOWb2BtAIWG5mN1Xb57mKfSYD44F/RTpo5Qy+tgCfSZTBi0iyRXOSdT1wXLW7r6u2zyYzG1qx3y3OuY2RjpttJRpl8CLRKS0tZfny5ezYsSPVTUmZvLw8OnfuTG7lQFkPUZ1kjUbFF8ETEXcMvnCWlWiUwYtEZ/ny5RQUFHDAAQdgmRQEouSco6SkhOXLl9O1a9c9OlbKhipQBi8i4ezYsYN27dplZXAHMDPatWsXl18wKQvwyuBFpDbZGtyD4vX+0yKDz4aTrMrgRbLDzp07w96/YcMGglOkrl69OiltSYsAnw0lGmXwIg3LPffcw9atW+vc58cff+T3v//97u2SkhLGjh0bdt8LLriAN954g+3bt3PGGWewefPmuLY3nLidZI35hbOsRKMMXiTBior8Eie9evVizJgxzJo1i4ceeoj+/fuza9cuBg0axNVXX83EiROZNm0aAwcO5P333+fWW29l9erVbN68mfPOO49du3ZRVFREz549eeyxx3jttdcoKSkhEAiwdu1aTjrppN2vNXfu3Li1u7KUBXhl8CISVxMnxjXADx8+nJYtW9K0aVPKy8sJBALMmjWLnj170rhxY0pLS/nggw+45JJLGDNmDLNnz+a0005j1qxZ5Ofn7z5OcXExkyZNom/fvowePZrNmzfz9NNPM3r0aMrKymrN+ONBJ1mTRBm8SD2YRb/Esn8EU6dO5aSTTuKtt96icaVgVfnk58yZMykpKWHcuHGccsopDBkyhI8//pijjjqKF154Yfd+/fr1Y+bMmaxcuZL58+fz7rvvUlJSwvz585k3bx4LFy6M3+dVTVpk8NlwklUZvEjDcdFFF9GnTx9efvllALZv314l0AOce+65nHjiidx8881ccsklrFy5kjFjxrBgwQJyc3MpKyujcePG5OXl0bRpU7p06cKIESPYvHkzK1euZMSIEQDs2rUrYe8jLQJ8NpRolMGL1EMsAcEs7gEkp+I/7tdff82pp55a7eWM2267jSuvvJLFixezePFiPvroI5YtW0ZBQQEFBQU8++yz5Ofn06xZM0455RT69evHvHnzGDduHP369QPY46tV66KTrElSOYNXgBdpGDZu3Mhrr73GF198QY8eVecxWrJkCUuWLOGRRx5h+PDhPPjgg8yaNYstW7bQqlUrcnNzyc/PZ/Hixfz2t78lJyeHe+65hw0bNtCoUSMeeughunbtSmlpKXfffTeHHVZjlPU9pgw+SSpn8CrRiCTAhAlxPdzOnTuZNm0ae++9N3379gX8ODnghxPo0qULN998M6+88govvfQS999/P9dccw3vvPMO++67L7fccgsHH3ww/fv3Z/r06cycOZMPP/yQoUOHYmYsXryY7du3c+aZZ9KrV6+4tj0oLfrBK4MXkT0Wxx40AGvXrmXSpEl8/fXXXHvttQDccccd7LfffpSXlzN//nxeeOEFzjnnHAYNGsTFF1/MqlWr+Nvf/ka3bt24/fbb+eyzz/j666+54IIL6N69OzNmzKBJ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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "polynomial_regression = Pipeline((\n",
    "    ('poly_features', PolynomialFeatures(degree=10, include_bias=False)),\n",
    "    ('sgd_reg', LinearRegression()),\n",
    "))\n",
    "plot_learning_curves(polynomial_regression, X, y)\n",
    "plt.xlim(0,80)\n",
    "plt.ylim(0,3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 这里的误差低于线性回归\n",
    "- 两条曲线有一定差距，这意味着该模型在训练数据上的表现比验证集上要好很多， 这正是过度拟合的标志"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 3)"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAD6CAYAAACrklzBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXhU5fn/8fcdCIRNQKSggLhhERCtooIWv4hotWpZ2rq0VVu1fGvVWrVabf0JWPXyq9ZavZSKW9XWqnUDtdalioKiElwQtaCloGwCYV+y378/nhlmMpkkkzDJzGQ+r+s6V86ZeXLmnsnknnue85znmLsjIiKtT0GmAxARkeahBC8i0kopwYuItFJK8CIirZQSvIhIK6UELyLSSqWU4M1sVzM7zsx2a+6AREQkPRpM8GbWHXgOOBx4zcx61tHuPjObY2ZXpzlGERFpglQq+KHApe5+PfAicEhiAzObALRx9xHAPmY2IL1hiohIY7VtqIG7vw5gZkcTqvhrkzQbBTweWX8J+CbwWXwDM5sITATo1KnToQMHDmwwuAULoKwsrA8eDEVFDf6KiEirNW/evLXunrQXJZkGEzyAmRlwGrAeqEjSpBOwPLK+jiRVvrtPA6YBDBs2zIuLixt83EGD4NNPw/pjj4UkLyKSr8xsaWPap3SQ1YMLgPnAd5I02QJ0iKx3TnW/DSksjK1XVqZjjyIi+SOVg6y/NrOzIpvdgA1Jms0jdMsAHAQsSUdwbeO+X1Qk+94gIiJ1SqXSngacaWZvAG2AZWZ2XUKbZyJtbgVOBZ5PR3Cq4EVEmi6Vg6zrgeMSbr46oc0mMxsVaXeTu29MS3Cq4EXyTkVFBcuWLaO0tDTToWRMUVERffv2pTC+ym2ClA6ypiLyQfB4gw0bQRW8SP5ZtmwZXbp0Ya+99iKM78gv7k5JSQnLli1j77333ql9ZfVUBargRfJPaWkpPXr0yMvkDmBm9OjRIy3fYLI6wauCF8lP+Zrco9L1/LM6wauCF5FcUxY9OzPBhg0biF4idfXq1S0SS1Yn+PgKXgleRFrSnXfeydatW+tt89VXX3H55Zfv2C4pKWHcuHFJ25577rm88cYbbN++ndNPP53NmzenNd5k0naQtTnEV/DqohGRek2eHJY0GThwIGPHjmX69Oncf//9HHjggZSXlzN8+HCuuOIKpkyZwgMPPMARRxzBe++9x80338zq1avZvHkzP/7xjykvL2fy5Mnsv//+/PWvf+XVV1+lpKSEqqoq1q5dyymnnLLjsWbOnJm2uONldYJXBS8iKZsyJa0J/thjj2WXXXahffv2VFdXU1VVxfTp09l///1p27YtFRUVvP/++1x44YWMHTuWV155he9973tMnz6dzp0779hPcXExN954I4MHD+bkk09m8+bNPPnkk5x88slUVlbWWfGnQ8500aiCF8lDZqkvjWnfgGnTpnHKKafw1ltv0TauKyH+4Oejjz5KSUkJEyZMYPz48YwcOZKPPvqIo446ihdeeGFHuyFDhvDoo4+yYsUKZs+ezbvvvktJSQmzZ89m1qxZzJs3L32vV4KsruB1kFVEMmHixIkMGjSIl156CYDt27fXSPQAZ511FieccAI33HADF154IStWrGDs2LHMmTOHwsJCKisradu2LUVFRbRv355+/foxZswYNm/ezIoVKxgzZgwA5eXlzfY8sjrBq4IXyXORUScpMWtc+xQUFIROjsWLF/Pd73434eGMW265hUsvvZQFCxawYMECPvzwQ5YsWUKXLl3o0qULTz/9NJ07d6ZDhw6MHz+eIUOGMGvWLCZMmMCQIUMAdvps1fpkdYJXBS8imbRx40ZeffVVFi1axIABNa9jtHDhQhYuXMhDDz3Esccey3333cf06dPZsmULXbt2pbCwkM6dO7NgwQJ+/vOfU1BQwJ133smGDRto06YN999/P3vvvTcVFRXccccdHHJIrVnWd1pWJ3hV8CKSskmT0rq7srIyHnjgAXr37s3gyMUoKiKVprvTr18/brjhBl5++WVefPFF7rnnHq666ireeecd+vTpw0033cRBBx3EgQceyMMPP8yjjz7KBx98wKhRozAzFixYwPbt2znjjDNI5QJITZHVB1lVwYtIytI4ggZg7dq13HjjjSxevJjf/va3ANx2223sueeeVFdXM3v2bF544QXOPPNMhg8fzgUXXMCqVav485//zD777MMf/vAHPv30UxYvXsy5557LvvvuyyOPPEK7du0oLy/n9ttv57LLLuP5559n0aJFaY09yjzNfVapSPWKTldfDddfH9Z/97uwLSKt26effsoBBxyQ6TCaZOvWrbRp04aiNFxfNNnrYGbz3H1YqvvI6i4aVfAikks6deqU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KXzZZaG7qbQ0XE1rzZrQ1j22FBSEv0106dIlHBCu6/iESL5pbILH3Vt8OfTQQz2T9t8/llbuust97drUfq+62v2//3V/9FH3Sy5xHz7cvW3b+BQVln32cX/55dq//9Zb7oWFsXannx722Rq99pr7HnvUfF0KrKrWa9XQYubeo4f7wIHuI0eG1/2f/3Tftq3hGMrK3DdtSsOTmTRp57ZT2adICoBib0SuzcsEP3p07SRy8MHu3/+++7e/7X700e6HHOI+aJD7AQeE5DJwoPvXvta45HTWWe6vvOJ+881h3127xu476CD3rVsz+jI0uzVr3E86qXGvWapLUZH7t77lft117k8/7b5okXtlpfuKFe733OP+ne+4d+wY2g4c6P6zn4UP5pWX3Vw70LqSbUWF+2OPhZ0sWBAewD3yb+PhU2bevLC9bFns0zp6f32PkdimKR8SkneU4FNwxx3pTTaDBoUEct117t26Ndx+113dFy/O6EvQYqqr3W+98ivvbusc3DsUbPf+3db7YQM3+mhe8WOPdR8zxv2449xH7/0fP+II98GD3fv3T+21jF/at0+t3bhx7h98EBdkYrK95hr3Z54Jnwzxv9i5s/uoUWF9wIBQGcTfv9tu7sceG9b/+lf3f//bvaoq9hjTp7v/9Kfue+4Ztk880f2Xv3T/05/C9vr1dceULOHrQyDvNDbB510ffNSbb4bRIP/6V+j7TnVul112gcMOgyOOCMuRR9Yc871qVRin/thjyX9/jz3gb38LQyTzwhVXwM03U0kbymhPJ7bVvP+44+D448PZU0OHhlQZNXkylVdPpqQkDM9csgRe+d0c/rlxRMqjn9pQSVUdo4EndH+NSUOfZujrd8CNN8Kee4aDHuPGNe25JtOuXXheqb7f99wztH/uObjjjjCut29fKg8bzpZ1FWzZamzZEo79tD10KEUL51NUBO3bg998CxUX/4qKinASWs+esQEFQDg4Mnly+p5bFlq2LLx027eHY1nt2oWlRw/Yd1/Ye+9wbAvC//yKFfDf/4b/261bw+sav5SWhn2Vlob21dWxpXv3cBJh//7hz9a7d+z4UadODR87qqoKI90++ywsixaFn488EvadjA6yNsGmTSHhb9gQDuxF/0hFRWGETXRp3z6cGZrKqfrPPx/Ggq9fH8a3H3YYHH54OLGosLDZn1J2KCsLCXzW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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "polynomial_regression = Pipeline((\n",
    "    ('poly_features', PolynomialFeatures(degree=2, include_bias=False)),\n",
    "    ('sgd_reg', LinearRegression()),\n",
    "))\n",
    "plot_learning_curves(polynomial_regression, X, y)\n",
    "plt.xlim(0,80)\n",
    "plt.ylim(0,3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 偏差/方差权衡"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 在统计学和机器学习领域， 一个重要的理论结果是， 模型的泛化误差可以被表示为三个截然不同的误差之和：\n",
    "\n",
    "1. 偏差\n",
    ">这部分泛化误差的原因在于错误的假设，比如假设数据是线性的，而实际上是二次的。高偏差模型最有可能对训练数据拟合不足\n",
    "2. 方差\n",
    "> 这部分误差是由于模型对训练数据的微小变化过度敏感导致的。具有高自由度的模型（例如高阶多项式模型）很可能也有高方差，所以很容易对训练数据过度拟合\n",
    "3. 不可避免误差\n",
    "> 这部分误差是因为数据本身的噪声所致。 减少这部分误差的唯一方法就是清理数据（例如修复数据源， 如损坏的传感器， 或者是检测并移除异常值）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": false
   },
   "source": [
    "# 正则线性模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 概述\n",
    "- 减少过度拟合的一个好办法就是对模型正则化（即约束它） ： 它拥有的自由度越低， 就越不容易过度拟合数据。 比如， 将多项式模型正则化的简单方法就是降低多项式的阶数\n",
    "- 对线性模型来说， 正则化通常通过约束模型的权重来实现。 接下来我们将会使用岭回归（Ridge Regression）、套索回归（LassoRegression）及弹性网络（Elastic Net）这三种不同的实现方法对权重进行约束。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 岭回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 岭回归（也叫作吉洪诺夫正则化） 是线性回归的正则化版： 在成本函数中添加一个等于$ \\alpha\\sum_{i=1}^n\\theta_i^2 $的正则项\n",
    "- 这使得学习中的算法不仅需要拟合数据， 同时还要让模型权重保持最小\n",
    "- 注意， 正则项只能在训练的时候添加到成本函数中， 一旦训练完成， 你需要使用未经正则化的性能指标来评估模型性能。\n",
    "- 超参数α控制的是对模型进行正则化的程度。 如果α=0， 则岭回归就是线性模型。 如果α非常大， 那么所有的权重都将非常接近于零， 结果是一条穿过数据平均值的水平线。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 岭回归成本函数\n",
    "$$ J(\\theta)=MSE(\\theta)+\\alpha\\frac{1}{2}\\sum_{(i=1)}^n\\theta_i^2 $$\n",
    "- 左边是直接使用岭回归，右边是经过10阶多项式后再岭回归\n",
    "\n",
    "![](img/4-17.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 闭式解的岭回归\n",
    "<small>其中A是一个n×n的单位矩阵，除了左上单元格为0， 其他与偏置项对应</small>\n",
    "$$ \\hat{\\theta}=(X^T·X+\\alpha A)^{-1}·X^T·y $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4.94257461]])"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import Ridge\n",
    "ridge_reg = Ridge(alpha=1, solver='cholesky')\n",
    "ridge_reg.fit(X, y)\n",
    "ridge_reg.predict([[1.5]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Davion\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([4.92716094])"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_reg = SGDRegressor()\n",
    "sgd_reg.fit(X, y)\n",
    "sgd_reg.predict([[1.5]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2788f2ff048>]"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(X, y, '.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## Lasso回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 线性回归的另一种正则化， 叫作最小绝对收缩和选择算子回归（Least Absolute Shrinkage and Selection Operator Regression， 简称Lasso回归， 或套索回归）\n",
    "- 与岭回归一样， 它也是向成本函数增加一个正则项， 但是它增加的是权重向量的l1范数， 而不是l2范数的平方的一半。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Lasso回归成本函数\n",
    "$$ J(\\theta)=MSE(\\theta)+\\alpha\\sum_{i=1}^n|\\theta_i| $$\n",
    "- Lasso回归的一个重要特点是它倾向于完全消除掉最不重要特征的权重（也就是将它们设置为零）。\n",
    "- 因为所有高阶多项式的特征权重都等于零。 换句话说， Lasso回归会自动执行特征选择并输出一个稀疏模型（即只有很少的特征有非零权重）\n",
    "![](img/4-18.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](img/4-19.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Lasso回归次梯度向量\n",
    "![](img/4-19-1.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4.89715424])"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import Lasso\n",
    "lasso_reg = Lasso(alpha=0.1)\n",
    "lasso_reg.fit(X, y)\n",
    "lasso_reg.predict([[1.5]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 弹性网络"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 弹性网络是岭回归与Lasso回归之间的中间地带。 \n",
    "- 其正则项就是岭回归和Lasso回归的正则项的混合， 混合比例通过r来控制。 \n",
    "- 当r＝0时， 弹性网络即等同于岭回归， \n",
    "- 而当r＝1时， 即相当于Lasso回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 弹性网络成本函数\n",
    "$$ J(\\theta)=MSE(\\theta)+r\\alpha\\sum_{i=1}^n|\\theta_i|+\\frac{1-r}{2}\\alpha\\sum_{i=1}^n\\theta_i^2 $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 那么， 到底如何选用线性回归、 岭回归、 Lasso回归和弹性网络呢？ \n",
    "- 通常来说， 有正则化——哪怕是很小， 总是比没有更可取一些。\n",
    "- 所以大多数情况下， 你应该避免使用纯线性回归。 \n",
    "- <mark>岭回归是个不错的默认选择</mark>， \n",
    "- 但是如果你觉得<mark>实际用到的特征只有少数几个</mark>， 那就应该更倾向于Lasso回归或是弹性网络， 因为它们会将无用特征的权重降为零。\n",
    "- 一般而言， 弹性网络优于Lasso回归， 因为当特征数量超过训练实例数量， 又或者是几个特征强相关时， Lasso回归的表现可能非常不稳定。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 早期停止法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 对于梯度下降这一类迭代学习的算法， 还有一个与众不同的正则化方法， 就是在验证误差达到最小值时停止训练， 该方法叫作早期停止法。 \n",
    "- 经过一轮一轮的训练， 算法不断地学习， 训练集上的预测误差（RMSE） 自然不断下降， \n",
    "- 同样其在验证集上的预测误差也随之下降。\n",
    "- 但是， 一段时间之后， 验证误差停止下降反而开始回升。\n",
    "- 这说明模型开始过度拟合训练数据。\n",
    "- 通过早期停止法， 一旦验证误差达到最小值就立刻停止训练。\n",
    "- 这是一个非常简单而有效的正则化技巧， 所以Geoffrey Hinton称其为“美丽的免费午餐”。\n",
    "\n",
    "![](img/4-20.png)\n",
    "\n",
    "<small>对随机梯度下降和小批量梯度下降来说， 曲线没有这么平滑， 所以很难知道是否已经达到最小值。 <mark>一种解决方法是等验证误差超过最小值一段时间之后再停止</mark>（这时你可以确信模型不会变得更好了） ， 然后将模型参数回滚到验证误差最小时的位置。</small>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 代码演示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)\n",
    "m = 100\n",
    "X = 6 * np.random.rand(m, 1) - 3\n",
    "y = 2 + X + 0.5 * X**2 + np.random.randn(m, 1)\n",
    "\n",
    "X_train, X_val, y_train, y_val = train_test_split(X[:50], y[:50].ravel(), test_size=0.5, random_state=10)\n",
    "\n",
    "poly_scaler = Pipeline([\n",
    "        (\"poly_features\", PolynomialFeatures(degree=90, include_bias=False)),\n",
    "        (\"std_scaler\", StandardScaler()),\n",
    "    ])\n",
    "\n",
    "X_train_poly_scaled = poly_scaler.fit_transform(X_train)\n",
    "X_val_poly_scaled = poly_scaler.transform(X_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.base import clone\n",
    "sgd_reg = SGDRegressor(max_iter=1, tol=-np.infty, warm_start=True, penalty=None,\n",
    "                       learning_rate=\"constant\", eta0=0.0005, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [],
   "source": [
    "minimun_val_error = float('inf')\n",
    "best_epoch = None\n",
    "best_model = None\n",
    "for epoch in range(1000):\n",
    "    sgd_reg.fit(X_train_poly_scaled, y_train)\n",
    "    y_val_predict = sgd_reg.predict(X_val_poly_scaled)\n",
    "    val_error = mean_squared_error(y_val_predict, y_val)\n",
    "    if val_error < minimun_val_error:\n",
    "        minimun_val_error = val_error\n",
    "        best_epoch = epoch\n",
    "        best_model = clone(sgd_reg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1.3513110512453865,\n",
       " 238,\n",
       " SGDRegressor(alpha=0.0001, average=False, early_stopping=False, epsilon=0.1,\n",
       "              eta0=0.0005, fit_intercept=True, l1_ratio=0.15,\n",
       "              learning_rate='constant', loss='squared_loss', max_iter=1,\n",
       "              n_iter_no_change=5, penalty=None, power_t=0.25, random_state=42,\n",
       "              shuffle=True, tol=-inf, validation_fraction=0.1, verbose=0,\n",
       "              warm_start=True))"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "minimun_val_error, best_epoch, best_model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": false
   },
   "source": [
    "## 逻辑回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 概述\n",
    "逻辑回归（Logistic回归， 也称为罗吉思回归） 被广泛用于估算一个实例属于某个特定类别的概率。 （比如， 这封电子邮件属于垃圾邮件的概率是多少？ ） 如果预估概率超过50%， 则模型预测该实例属于该类别（称为正类， 标记为“1”） ， 反之， 则预测不是（也就是负类， 标记为“0”） 。 这样它就成了一个二元分类器。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "### 概率估算"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 逻辑回归模型概率估算（向量化形式）\n",
    "$$ \\hat{p}=h_{\\theta}(X)=\\sigma(\\theta^T·x) $$\n",
    ">逻辑模型（也称为罗吉特），是一个sigmoid函数（即S形），记作σ（·），它的输出为一个0到1之间的数字。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 逻辑函数\n",
    "$$\\sigma(t)=\\frac{1}{1+exp(-t)}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.1, 1.1)"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiQAAADACAYAAAA0uXjNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3de3hU5bn38e+TSUgCgUAggKicBGGLimA4WLUuLR5wF2pFhSp2F7WxilraYl+xFnfF3VKlB7YVW6iKiihIUYt1o1IFFQSSQICIBhACBAhJSMj5MEme948MY4xJGGGSlUx+n+uaa9az5l5r7skza9addTTWWkRERETcFOZ2AiIiIiIqSERERMR1KkhERETEdSpIRERExHUqSERERMR1KkhERETEdeFuvGmPHj1s//793XhrEWkh6enpAAwZMsTlTESkuaWkpORaa+NPZx6uFCT9+/cnOTnZjbcWkRbiOA4Aa9eudTUPEWl+xpj9pzsP7bIRERER16kgEREREdepIBERERHXqSARERER16kgEREREdepIBERERHXqSARERER16kgEREREdepIBERERHXBVSQGGN6GWM+auL1CGPMKmPMemPMHcFLT0RERNqDkxYkxphuwAtApybC7gdSrLWXAjcZYzo3Nc/09HQWL14MgNfrxXEclixZAkBpaSmO47Bs2TIACgoKcByHlStXApCbm4vjOKxatQqArKwsHMdh9erVABw8eBDHcVizZg0Ae/fuxXEc1q1b539vx3HYsGEDAGlpaTiOQ1JSEgCpqak4jkNqaioASUlJOI5DWloaABs2bMBxHP99OtatW4fjOOzduxeANWvW4DgOBw8eBGD16tU4jkNWVhYAq1atwnEccnNzAVi5ciWO41BQUADAsmXLcByH0tJSAJYsWYLjOHi9XgAWL17svyQ3wKJFixg3bpy/vWDBAsaPH+9vz58/n4kTJ/rb8+bNY9KkSf723LlzmTJlir89Z84cpk6d6m/Pnj2badOm+duzZs0iMTHR3545cybTp0/3t2fMmMGMGTP87enTpzNz5kx/OzExkVmzZvnb06ZNY/bs2f721KlTmTNnjr89ZcoU5s6d629PmjSJefPm+dsTJ05k/vz5/vb48eNZsGCBvz1u3DgWLVrkbzuOo+9eC333MjMz/bmDvnv67n3z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\n",
      "text/plain": [
       "<Figure size 648x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "t = np.linspace(-10, 10, 100)\n",
    "sig = 1 / (1 + np.exp(-t))\n",
    "plt.figure(figsize=(9, 3))\n",
    "plt.plot(t, sig, '-')\n",
    "plt.plot([-10, 10], [0, 0], \"k-\")\n",
    "plt.plot([-10, 10], [0.5, 0.5], \"k:\")\n",
    "plt.plot([-10, 10], [1, 1], \"k:\")\n",
    "plt.plot([0, 0], [-1.1, 1.1], \"k-\")\n",
    "plt.xlim(-10, 10)\n",
    "plt.ylim(-0.1, 1.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 逻辑回归模型预测\n",
    "![](img/4-21-1.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "### 训练和成本函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 单个训练实例的成本函数\n",
    "![](img/4-21-2.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 逻辑回归成本函数（log损失函数）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ J(\\theta)=-\\frac{1}{m}\\sum_{i=1}^m[y^ilog(\\hat{p}^i)+(1-y^i)log(1-\\hat{p}^i)] $$\n",
    ">- 坏消息是，这个函数没有已知的闭式方程（不存在一个标准方程的等价方程） 来计算出最小化成本函数的θ值。 \n",
    ">- 好消息是，这是个凸函数，所以通过梯度下降（或是其他任意优化算法）保证能够\n",
    "找出全局最小值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Logistic成本函数的偏导数\n",
    "$$ \\frac{\\partial}{\\partial\\theta_i}J(\\theta)=\\frac{1}{m}\\sum_{i=1}^m(\\sigma(\\theta^T·x^i)-y^i)x_j^i $$\n",
    ">计算出每个实例的预测误差， 并将其乘以第j个特征值， 然后再对所有训练实例求平均值。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "### 决策边界\n",
    "- 这里用鸢尾植物数据集来说明逻辑回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### iris数据集\n",
    "- 这是一个非常著名的数据集，\n",
    "- 共有150朵鸢尾花， \n",
    "- 分别来自三个不同品种： Setosa鸢尾花、 Versicolor鸢尾花和Virginica鸢尾花，\n",
    "- 数据里包含花的萼片以及花瓣的长度和宽度\n",
    "\n",
    "- 我们试试仅基于花瓣宽度这一个特征， 创建一个分类器来检测\n",
    "Virginica鸢尾花"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "iris = datasets.load_iris()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(['sepal length (cm)',\n",
       "  'sepal width (cm)',\n",
       "  'petal length (cm)',\n",
       "  'petal width (cm)'],\n",
       " array(['setosa', 'versicolor', 'virginica'], dtype='<U10'))"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris['feature_names'], iris['target_names']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 使用逻辑回归，仅基于花瓣宽度这一个特征， 创建一个分类器来检测 Virginica鸢尾花"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = iris['data'][:,3]     # 只看花瓣宽度特征\n",
    "y = (iris['target'] == 2) # 判断是非为Virginica鸢尾花"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "log_reg = LogisticRegression(solver=\"liblinear\", random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Davion\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:724: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                   multi_class='warn', n_jobs=None, penalty='l2',\n",
       "                   random_state=42, solver='liblinear', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg.fit(X.reshape(-1,1), y.reshape(-1,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_new = np.linspace(0,3,1000).reshape(-1, 1)\n",
    "y_proba = log_reg.predict_proba(X_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, '概率')"
      ]
     },
     "execution_count": 158,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(X_new, y_proba[:,1], 'g-', label='Virginica鸢尾花')\n",
    "plt.plot(X_new, y_proba[:,0], 'b--', label='非Virginica鸢尾花')\n",
    "plt.legend(loc='center left', fontsize=12)\n",
    "plt.xlabel('花瓣宽度（cm）', fontsize=16)\n",
    "plt.ylabel('概率', fontsize=16)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 159,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True, False])"
      ]
     },
     "execution_count": 159,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg.predict([[1.7], [1.5]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 使用逻辑回归，基于花瓣宽度和花瓣长度， 创建一个分类器来检测 Virginica鸢尾花"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 173,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = iris['data'][:,(2,3)]\n",
    "y = (iris['target'] == 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                   multi_class='warn', n_jobs=None, penalty='l2',\n",
       "                   random_state=42, solver='liblinear', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "log_reg.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "### Softmax回归"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 逻辑回归模型经过推广，可以直接支持多个类别，而不需要训练并组合多个二元分类器\n",
    "- 这就是Softmax回归， 或者叫多元逻辑回归。\n",
    "- 对于一个给定的实例x，Softmax回归模型首先计算出每个类别k的分数sk（x），然后对这些分数应用softmax函数（也叫归一化指数），估算出每个类别的概率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 类别k的Softmax分数\n",
    "$$ S_k(X)=\\theta_k^T·X $$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算完实例x每个类别的分数后，就可以通过Softmax函数来计算分数：计算出每个分数的指数，然后对它们进行归一化处理（除以所有指数的总和）即得到 ，也就是实例属于类别k的概率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Softmax函数\n",
    "$$ \\hat{p}_k=\\sigma(S(X))_k=\\frac{exp(S_k(X))}{\\sum_{j=1}^Kexp(s_j(X))} $$\n",
    "- K是类别变量\n",
    "- s（x） 是实例x每个类别的分数的向量\n",
    "- $ \\sigma(S(X))_k $是给定的类别分数下， 实例x属于类别k的概率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Softmax回归分类器预测\n",
    "- 跟逻辑回归分类器一样， Softmax回归分类器将估算概率值最高的类别作为预测类别（也就是分数最高的类别） \n",
    "- ·argmax运算符返回的是使函数最大化所对应的变量的值。 在这个等式里， 它返回的是使估算概率（s（x） ） k最大的k的值\n",
    "$$ \\hat{y}=argmax_k\\sigma(S(X))_k=argmax_ks_k(X)=argmax_k(\\theta_k^T·X) $$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Softmax回归分类器一次只会预测一个类别（也就是说，它是多类别，但是不是多输出），所以它应该仅适用于互斥的类别之上，例如植物的不同种类。 你不能用它来识别一张照片中的多个人"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 交叉熵成本函数\n",
    "$$ J(\\Theta)=-\\frac{1}{m}\\sum_{i=1}^m\\sum_{k=1}^Ky_k^{(i)}log(\\hat{p}_k^{(i)}) $$\n",
    "- 如果第i个实例的目标类别为k， 则$y_k$等于1， 否则为0。\n",
    "- 注意， 当只有两个类别（K=2） 时， 该成本函数等价于逻辑回归的成本函数\n",
    "- 因为当模型对目标类别做出较低概率的估算时， 会受到惩罚。 交叉熵经常被用于衡量一组估算出的类别概率跟目标类别的匹配程度"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 交叉熵\n",
    "- 交叉熵源于信息理论。 \n",
    "- 假设你想要有效传递每天的天气信息，\n",
    "- 选项（晴、下雨等）有8个，那么你可以用3比特对每个选项进行编码，因为$2^3$=8。\n",
    "- 但是， 如果你认为几乎每天都是晴天，那么，对“晴天”用1比特（0），其他七个类别用4比特（从1开始）进行编码，显然会更有效率一些。\n",
    "- 交叉熵衡量的是你每次发送天气选项的平均比特数。\n",
    "- 如果你对天气的假设是完美的， 交叉熵将会等于天气本身的熵（也就是其本身固有的不可预测性）。\n",
    "- 但是如果你的假设是错误的（比如经常下雨），交叉熵将会变大，增加的这一部分我们称之为KL散度（Kullback-Leibler divergence， 也叫作相对熵） 。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 两个概率分布p和q之间的交叉熵定义为H（p， q） =-Σxp（x） log q（x） 至少在离散分布时可以这样定义）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 对于类别k的交叉熵梯度向量\n",
    "$$ \\nabla_{\\theta_{k}}J{\\Theta}=\\frac{1}{m}\\sum_{i=1}^m(\\hat{p}_k^{(i)}-y_k^{(i)})X^{(i)} $$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = iris['data'][:,(2,3)]\n",
    "y = iris['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=10, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                   multi_class='multinomial', n_jobs=None, penalty='l2',\n",
       "                   random_state=42, solver='lbfgs', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)"
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "softmax_reg = LogisticRegression(multi_class='multinomial', solver='lbfgs', C=10, random_state=42)\n",
    "softmax_reg.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2])"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "softmax_reg.predict([[5, 2]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[6.38014896e-07, 5.74929995e-02, 9.42506362e-01]])"
      ]
     },
     "execution_count": 196,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "softmax_reg.predict_proba([[5, 2]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0, 3.5)"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x0, x1 = np.meshgrid(\n",
    "        np.linspace(0, 8, 500).reshape(-1, 1),\n",
    "        np.linspace(0, 3.5, 200).reshape(-1, 1),\n",
    "    )\n",
    "X_new = np.c_[x0.ravel(), x1.ravel()]\n",
    "\n",
    "\n",
    "y_proba = softmax_reg.predict_proba(X_new)\n",
    "y_predict = softmax_reg.predict(X_new)\n",
    "\n",
    "zz1 = y_proba[:, 1].reshape(x0.shape)\n",
    "zz = y_predict.reshape(x0.shape)\n",
    "\n",
    "plt.figure(figsize=(10, 4))\n",
    "plt.plot(X[y==2, 0], X[y==2, 1], \"g^\", label=\"Virginica\")\n",
    "plt.plot(X[y==1, 0], X[y==1, 1], \"bs\", label=\"Versicolor\")\n",
    "plt.plot(X[y==0, 0], X[y==0, 1], \"yo\", label=\"Setosa\")\n",
    "\n",
    "from matplotlib.colors import ListedColormap\n",
    "custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])\n",
    "\n",
    "plt.contourf(x0, x1, zz, cmap=custom_cmap)\n",
    "contour = plt.contour(x0, x1, zz1, cmap=plt.cm.brg)\n",
    "plt.clabel(contour, inline=1, fontsize=12)\n",
    "plt.xlabel(\"Petal length\", fontsize=14)\n",
    "plt.ylabel(\"Petal width\", fontsize=14)\n",
    "plt.legend(loc=\"center left\", fontsize=14)\n",
    "plt.xlim(0, 7)\n",
    "plt.ylim(0, 3.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc-autonumbering": true,
  "toc-showtags": false
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
